package com.eight.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


public class JWTTool {
    private static final String KEY = "czy";

    /**
     * 根据传递过来的信息制作登录token
     *
     * @param userInfo 用户的信息
     * @return 生成的token
     */
    public static String generateToken(Map<String, Object> userInfo) {
        // 固定的头格式
        Map<String, Object> headMap = new HashMap<>();
        headMap.put("alg", "HS256");
        headMap.put("typ", "JWT");
        // 创建日历实例，分别获取当前时间以及七天后的时间分别作为颁发日期于过期日期
        Calendar calendar = Calendar.getInstance();
        Date now = calendar.getTime();
        calendar.add(Calendar.DAY_OF_MONTH, 7);
        Date expired = calendar.getTime();
        // 创建token
        // 返回签名
        return JWT.create()
                // 设置头信息为固定的
                .withHeader(headMap)
                // 设置主题，随便你
                .withSubject("用户信息")
                // 设置发布日期
                .withIssuedAt(now)
                // 设置过期日期
                .withExpiresAt(expired)
                // 设置自定义的信息也就是要保存的用户信息
                .withClaim("userInfo", userInfo)
                // 设置签名信息,签名密钥为上面定义的key
                .sign(Algorithm.HMAC256(KEY));
    }

    /**
     * 校验token信息
     *
     * @param token 前端传递过来的token
     * @return 是否校验通过
     */
    public static boolean verifyToken(String token) {
        // tk解析验证器，需要指定加密方法以及签名信息
        JWTVerifier build = JWT.require(Algorithm.HMAC256(KEY)).build();
        // 调用方法对tk进行验证,若校验通过则返回真否则返回假证明校验不通过
        try {
            build.verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 解析出token中的用户自定义信息
     *
     * @param token 传递过来的token
     * @return 解析出来的数据
     */
    public static Map<String, Object> analyzeToken(String token) {
        // 解析出token中的自定义信息并且转化为Map的形式
        return JWT.decode(token).getClaim("userInfo").asMap();
    }
}
